#ifndef __TLV_H__
#define __TLV_H__
#include <stdint.h>
#include<my_header.h>
#include<openssl/sha.h>
#include<mysql/mysql.h>
#include"directoryOperation.h"
#include"fileTable.h"

typedef enum {
    // 基本命令
    CMD_CD = 0x01,          // 改变目录
    CMD_LS = 0x02,          // 列出目录
    CMD_PWD = 0x03,         // 当前工作目录

    // 文件操作命令
    CMD_PUTS = 0x10,        // 上传文件
    CMD_GETS = 0x11,        // 下载文件
    CMD_REMOVE = 0x12,      // 删除文件
    CMD_MKDIR = 0x13,       // 创建目录
    CMD_RMDIR = 0x14,       // 删除目录

    // 大文件传输命令
    CMD_FILE_CHECK=0x18,   //检测文件是否重复
    CMD_FILE_EXISTS=0x19,    //文件重复
    CMD_FILE_START = 0x20,  // 文件传输开始
    CMD_FILE_DATA = 0x21,   // 文件数据块
    CMD_FILE_END = 0x22,    // 文件传输结束

    // 响应和错误
    CMD_RESPONSE = 0x30,    // 正常响应
    CMD_REGISTER =0x41,   //注册
    CMD_SIGNIN=0x42,  //登录
    CMD_ERROR = 0xFF        // 错误响应
} CommandType;

// TLV协议头大小 (type + length + seq + checksum)
#define TLV_HEADER_SIZE 13
#define PATH_MAX 1024
// TLV结构体
typedef struct TLV_s{
    uint8_t type;           // 命令类型 (1字节)
    uint32_t length;        // 数据长度 (4字节)
    uint32_t seq;           // 可选。。。序列号 (4字节)
    char value[1024];           // 数据长度（文件？）
} TLV_t;

int sendTlv(int sockfd,TLV_t*tlv);
int recvTlv(int sockfd,TLV_t*tlv);
int recvFile(int netfd,TLV_t*tlv,pathStack_t * pstack,MYSQL*mysql,fileMetaData_t*meta);
int getFIle(int netfd,TLV_t*tlv);
int check_file_hash(int netfd,TLV_t*tlv,MYSQL*mysql);


#endif